package com.arvinclub.service.service;

import com.arvinclub.model.entity.User;
import com.arvinclub.model.util.MutedException;
import com.arvinclub.model.util.ToolsUtil;
import com.arvinclub.service.dao.UserDao;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * 用户Service层
 */
@Service
public class UserService {

    @Resource
    private UserDao userDao;

    /**
     * 管理员界面每页展示数量
     */
    private final int PAGE_SIZE = 10;

    /**
     * 通过id查找用户（个人主页功能）
     */
    public User findUserById(int id) {
        User user = userDao.backUserById(id);
        user.setFansCount(userDao.fansCount(id));
        user.setIdolCount(userDao.idolCount(id));
        return user;
    }

    /**
     * 通过用户名和密码查找用户（用于登录前校验）
     */
    public User checkUser(User user) {
        return userDao.checkUser(user);
    }

    /**
     * 检查是否存在重名（用于注册前校验）
     */
    public boolean existUserName(String name) {
        return userDao.backUserByName(name) != null;
    }

    /**
     * 添加用户（用于注册功能）
     */
    public boolean addUser(User user) {
        return userDao.addUser(user);
    }

    /**
     * 返回所有用户（用于管理员功能）
     */
    public PageInfo<User> selectAllUser(int page, String keyword) {
        PageHelper.startPage(page, PAGE_SIZE, true);
        return new PageInfo<>(userDao.selectAllUser(keyword));
    }

    /**
     * 删除用户
     */
    public void delUser(int id) {
        userDao.delUser(id);
    }

    /**
     * 恢复用户，与删除相反
     */
    public void reuseUser(int id) {
        userDao.reuseUser(id);
    }

    /**
     * 禁言或取消禁言
     */
    public void mute(int userId, int days) {
        User user = new User();
        user.setId(userId);
        user.setMuted(1);
        if (days == -1) {
            user.setMuted(0);
        } else if (days != 0) {
            user.setMuteDeadline(new Date(System.currentTimeMillis() + (long) days * 24 * 3600 * 1000));
        }
        userDao.mute(user);
    }

    /**
     * 检测是否被禁言，是则抛出异常，过期则取消
     */
    public void checkMuted(User user) {
        if (user.getMuted() == 0)
            return;
        Date date = user.getMuteDeadline();
        if (date != null && date.getTime() <= System.currentTimeMillis()) {
            user.setMuteDeadline(null);
            user.setMuted(0);
            userDao.mute(user);
            return;
        }
        throw new MutedException(user.getMuteDeadline() == null ? "永久" : ToolsUtil.SIMPLE_DATE_FORMAT.format(date));
    }

    /**
     * 判断是否已经关注了
     */
    public boolean isAttention(int fans, int idol) {
        return userDao.isAttention(fans, idol);
    }

    /**
     * 添加关注
     */
    public boolean addAttention(int fans, int idol) {
        return userDao.attention(fans, idol);
    }

    /**
     * 取消关注
     */
    public boolean delAttention(int fans, int idol) {
        return userDao.delAttention(fans, idol);
    }

    /**
     * 关注列表
     */
    public PageInfo<User> attentionList(int userId) {
        return new PageInfo<>(userDao.attentionList(userId));
    }

    /**
     * 粉丝列表
     */
    public PageInfo<User> fansList(int userId) {
        return new PageInfo<>(userDao.fansList(userId));
    }

}
